package io.dcloud.uni_modules.wrsUtsKeepalive

import android.annotation.SuppressLint
import android.app.Notification
import android.app.Service
import android.content.ComponentName
import android.content.Intent
import android.content.ServiceConnection
import android.os.Build
import android.os.IBinder
import android.os.RemoteException
import com.wrs.androidkeepalive.service.RemoteForegroundService
import com.wrs.androidkeepalive.utils.NotificationUtils
import com.wrs.module.keepalive.IMyAidlInterface

class LocalForegroundService: Service() {
    /**
     * 远程调用 Binder 对象
     */
    private var myBinder: MyBinder? = null

    /**
     * 连接对象
     */
    private var connection: Connection? = null

    /**
     * AIDL 远程调用接口
     * 其它进程调与该 RemoteForegroundService 服务进程通信时 , 可以通过 onBind 方法获取该 myBinder 成员
     * 通过调用该成员的 basicTypes 方法 , 可以与该进程进行数据传递
     */
    class MyBinder : IMyAidlInterface.Stub() {
        @Throws(RemoteException::class)
        override fun basicTypes(
            anInt: Int, aLong: Long, aBoolean: Boolean, aFloat: Float,
            aDouble: Double, aString: String
        ) {
            // 通信内容
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return myBinder
    }

    override fun onCreate() {
        super.onCreate()
        // 创建 Binder 对象
        myBinder = MyBinder()

        // 启动前台进程
        startService()
    }

    @SuppressLint("ForegroundServiceType")
    private fun startService() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationUtils.startNot(applicationContext, this)
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            startForeground(10, Notification())
            // API 18 ~ 25 以上的设备 , 启动相同 id 的前台服务 , 并关闭 , 可以关闭通知
            startService(Intent(this, CancelNotificationService::class.java))
        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
            // 将该服务转为前台服务
            // 需要设置 ID 和 通知
            // 设置 ID 为 0 , 就不显示已通知了 , 但是 oom_adj 值会变成后台进程 11
            // 设置 ID 为 1 , 会在通知栏显示该前台服务
            // 8.0 以上该用法报错
            startForeground(10, Notification())
        }
    }

    /**
     * 绑定 另外一个 服务
     * LocalForegroundService 与 RemoteForegroundService 两个服务互相绑定
     */
    private fun bindService() {
        // 绑定 另外一个 服务
        // LocalForegroundService 与 RemoteForegroundService 两个服务互相绑定

        // 创建连接对象

        connection = Connection()

        // 创建本地前台进程组件意图
        val bindIntent = Intent(
            this,
            RemoteForegroundService::class.java
        )
        // 绑定进程操作
        bindService(bindIntent, connection!!, BIND_AUTO_CREATE)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // 绑定另外一个服务
        bindService()
        return super.onStartCommand(intent, flags, startId)
    }

    class Connection : ServiceConnection {
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            // 服务绑定成功时回调
        }

        override fun onServiceDisconnected(name: ComponentName) {
            // 再次启动前台进程
            startService()
            // 绑定另外一个远程进程
            bindService()
        }
    }

    /**
     * API 18 ~ 25 以上的设备, 关闭通知到专用服务
     */
    // static
    class CancelNotificationService : Service() {
        override fun onCreate() {
            super.onCreate()
            startForeground(10, Notification())
            stopSelf()
        }

        override fun onBind(intent: Intent): IBinder? {
            return null
        }
    }
}